home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / iutil / compare.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-01-23  |  1.8 KB  |  99 lines

  1. # include    <ingres.h>
  2. # include    <access.h>
  3. # include    <symbol.h>
  4. # include    <aux.h>
  5. # include    <sccs.h>
  6.  
  7. SCCSID(@(#)compare.c    8.1    12/31/84)
  8.  
  9. icompare(ax, bx, frmt, frml)
  10. char    *ax, *bx, frmt, frml;
  11. {
  12.     register ANYTYPE    *a, *b;
  13.     register int        length;
  14.     float            f4var;
  15.     double            f8var;
  16.     ANYTYPE            atemp, btemp;
  17.  
  18.     length = frml & I1MASK;
  19.     if (frmt == CHAR)
  20.         return (scompare(ax, length, bx, length));
  21.     a = &atemp;
  22.     b = &btemp;
  23.     bmove(ax, (char *) a, length);
  24.     bmove(bx, (char *) b, length);
  25.     if (bequal((char *) a, (char *) b, length))
  26.         return (0);
  27.     switch (frmt)
  28.     {
  29.       case INT:
  30.         switch (length)
  31.         {
  32.           case 1:
  33.             return (a->i1type - b->i1type);
  34.           case 2:
  35.             return (a->i2type - b->i2type);
  36.           case 4:
  37.             return (a->i4type > b->i4type ? 1 : -1);
  38.         }
  39.         break;
  40.  
  41.       case FLOAT:
  42.         if (frml == 4)
  43.         {
  44.             if ( a->f4type > b->f4type )
  45.                 return ( 1 );
  46.             else
  47.                 return ( -1 );
  48.         }
  49.         else
  50.         {
  51.             if ( a->f8type > b->f8type )
  52.                 return ( 1 );
  53.             else
  54.                 return ( -1 );
  55.         }
  56.         break;
  57.     }
  58.     syserr("compare: t=%d,l=%d", frmt, frml);
  59.     /*NOTREACHED*/
  60. }
  61. /*
  62. **  KCOMPARE -- key compare
  63. **
  64. **    compares all domains indicated by SETKEY in the tuple to the
  65. **    corressponding domains in the key.
  66. **    the comparison is done according to the format of the domain
  67. **    as specified in the descriptor.
  68. **
  69. **    function values:
  70. **        <0 tuple < key
  71. **         =0 tuple = key
  72. **        >0 tuple > key
  73. */
  74.  
  75. kcompare (dx, tuple, key)
  76. DESC    *dx;            /*relation descriptor    */
  77. char    tuple[MAXTUP];        /*tuple to be compared    */
  78. char    key[MAXTUP];        /*second tuple or key    */
  79. {
  80.     register int    i, tmp;
  81.     register DESC    *d;
  82.  
  83.     d = dx;
  84.     for (i = 1; i <= d->reldum.relatts; i++)
  85.     {
  86.         if (d->relgiven[i])
  87.         {
  88.             if (tmp = icompare(&tuple[d->reloff[i]],
  89.                     &key[d->reloff[i]],
  90.                     d->relfrmt[i],
  91.                 d->relfrml[i]))
  92.             {
  93.                 return (tmp);
  94.             }
  95.         }
  96.     }
  97.     return (0);
  98. }
  99.